#!/bin/sh

# POST-COMMIT HOOK
#
# The post-commit hook is invoked after a commit.  Subversion runs
# this hook by invoking a program (script, executable, binary, etc.)
# named 'post-commit' (for which this file is a template) with the 
# following ordered arguments:
#
#   [1] REPOS-PATH   (the path to this repository)
#   [2] REV          (the number of the revision just committed)
#   [3] TXN-NAME     (the name of the transaction that has become REV)
#
# Because the commit has already completed and cannot be undone,
# the exit code of the hook program is ignored.  The hook program
# can use the 'svnlook' utility to help it examine the
# newly-committed tree.
#
# The default working directory for the invocation is undefined, so
# the program should set one explicitly if it cares.
#
# On a Unix system, the normal procedure is to have 'post-commit'
# invoke other programs to do the real work, though it may do the
# work itself too.
#
# Note that 'post-commit' must be executable by the user(s) who will
# invoke it (typically the user httpd runs as), and that user must
# have filesystem-level permission to access the repository.
#
# On a Windows system, you should name the hook program
# 'post-commit.bat' or 'post-commit.exe',
# but the basic idea is the same.
#
# The hook program runs in an empty environment, unless the server is
# explicitly configured otherwise.  For example, a common problem is for
# the PATH environment variable to not be set to its usual value, so
# that subprograms fail to launch unless invoked via absolute path.
# If you're having unexpected problems with a hook program, the
# culprit may be unusual (or missing) environment variables.
#
# CAUTION:
# For security reasons, you MUST always properly quote arguments when
# you use them, as those arguments could contain whitespace or other
# problematic characters. Additionally, you should delimit the list
# of options with "--" before passing the arguments, so malicious
# clients cannot bootleg unexpected options to the commands your
# script aims to execute.
# For similar reasons, you should also add a trailing @ to URLs which
# are passed to SVN commands accepting URLs with peg revisions.
#
# Here is an example hook script, for a Unix /bin/sh interpreter.
# For more examples and pre-written hooks, see those in
# /usr/share/subversion/hook-scripts, and in the repository at
# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and
# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/

export LANG=zh_CN.UTF-8

REPOS="$1"
REV="$2"
TXN_NAME="$3"

#"$REPOS"/hooks/mailer.py commit "$REPOS" $REV "$REPOS"/mailer.conf

co_html="/data/docx_html/svn$REPOS"
exp_html="/data/docx_html/exp$REPOS"

svn_html=$(svn ls file://$REPOS/docx_html 2>&1 | grep 'E200009' | wc -l)
if [ $svn_html -gt 0 ]; then
  svn mkdir file://$REPOS/docx_html -m "mkdir docx_html"
fi

mkdir -p "$co_html"
svn co --force file://$REPOS/docx_html "$co_html" 

#定义一个函数
process_docx()
{
  file=$1
  echo "Processing $file ..."
  
  svnpath=$(echo $file | awk -F/ -vOFS=/ '{NF=NF-1}1')
  fname=$(echo $file | awk -F/ '{print $NF}' | cut -d. -f1) 
  exp="$exp_html/$svnpath"
  html="$co_html/$svnpath/$fname"
  mkdir -p "$html"
  mkdir -p "$exp"
  svn export --force "file://$REPOS/$file" "$exp" 

  # Convert the .docx file to .html using pandoc with an absolute path
  pandoc --extract-media="$html" -t html "$exp_html/$file" -o "$html/docx.html"
  
  # Add the generated .html file to the current commit
  svn add --parents --force "$html"
  
  echo "$file processed and .html version added to the commit."
}

#新增word文档A
#for i in do循环改为while循环，for循环把空格和换行均当作分割符号，while循环可以仅把换行当作分割符号，for不能处理文件名称带空格的情况
#for file in $(svnlook changed $REPOS | grep '.docx$' | awk '{if($1~/A/){print$2}}'); do
svnlook changed $REPOS | grep '.docx$' | awk '{if($1~/A/){print$0}}' | awk -FA '{print$2}' | awk '{$1 = $1; print $0}' | while 
read file;
do
  process_docx "$file"
done

#更新word文档U
svnlook changed $REPOS | grep '.docx$' | awk '{if($1~/U/){print$0}}' | awk -FU '{print$2}' | awk '{$1 = $1; print $0}' | while
read file;
do
  process_docx "$file"
done

#while循环体对commits值的修改，退出循环体就没有作用了，改为svn status来判断是否需要提交
commits=$(svn status "$co_html" | wc -l)
if [ $commits -gt 0 ]; then
  LOGMSG=`svnlook log -r "$REV" "$REPOS"`
  svn ci -m "$LOGMSG (docx -> html)" "$co_html"
fi

cd /data/trac
project=$(echo $REPOS | awk -F/ '{print $NF}') 
trac-admin $project/ repository resync svn_$project

exit 0
